/* 函数-函数引用传递值
 *
 * @link: https://www.runoob.com/go/go-function-call-by-reference.html
 */

// 包申明
package main

// 引入包
import (
	"fmt"
)

/*
引用传递是指在调用函数时将实际参数的地址传递到函数中，那么在函数中对参数所进行的修改，将影响到实际参数。
引用传递指针参数传递到函数内，
*/

// 入口函数
func main() {
	// 定义局部变量
	var a int = 100
	var b int = 200

	fmt.Printf("交换前 a 的值为 : %d\n", a)
	fmt.Printf("交换前 b 的值为 : %d\n", b)

	// 通过调用函数来交互值
	// &a 指向 a 指针，a 变量的地址
	// &b 指向 b 指针，b 变量的地址
	swap(&a, &b)
	// a, b = b, a // 这样也可以交换赋值

	fmt.Printf("交换后 a 的值 : %d\n", a)
	fmt.Printf("交换后 b 的值 : %d\n", b)

}

// 定义相互交换值的函数
// 引用传值的函数无返回值,要注意
func swap(x *int, y *int) {
	var temp int
	temp = *x //保存 x 地址上的值
	*x = *y   //把 y 值赋值给 x
	*y = temp //把 temp 值赋值给 y

}

/*
运行结果:
交换前 a 的值为 : 100
交换前 b 的值为 : 200
交换后 a 的值 : 200
交换后 b 的值 : 100
*/
